/**
 * 
 */
package kr.pe.johnkim.dayve.activity;

import java.io.IOException;
import java.util.List;

import org.json.JSONException;

import kr.pe.johnkim.dayve.provider.DayveLog;
import kr.pe.johnkim.dayve.rest.DayveCommonRest;
import kr.pe.johnkim.dayve.util.DayveCommon;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

/**
 * @author johnkim
 *
 */
public class DayveRecommendView extends Activity {

	public static final String TAG = DayveRecommendView.class.getSimpleName();

	// 설정 파일을 가져 온다.
	private String myPreference = "kr.pe.johnkim.dayve.activity_preferences";

	private String DAYVE_ID = "";
	private String DAYVE_PASSWORD = "";
	private String DAYVE_EMAIL = "";
	private String currentDate = "";
	
	DayveCommonRest dayveCommonRest = new DayveCommonRest();
	DayveCommon dayveCommon = new DayveCommon();

	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 101;

	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 102;

	// 이메일을 보낸다.
	private static final int THREAD_SEND_EMAIL = 103;

	// 이메일 보내기에 성공하면 toast 를 띄운다.
	private static final int THREAD_SEND_EMAIL_SUCCESS = 104;

	// 이메일 보내기에 실패하면 dialog 창을 띄운다.
	private static final int THREAD_SEND_EMAIL_FAIL = 105;

	private String RESULT_SEND_EMAIL = "";
	
	ProgressBar progressBarRecommend;
	TextView txtViewRecommendNotification;
	
	EditText edtTextRecommendFrom;
	EditText edtTextRecommendTo;
	EditText edtTextRecommendSubject;
	EditText edtTextRecommendContent;
	Button btnRecommendSendEmail;
	
	/* (non-Javadoc)
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
//		setContentView(R.layout.dayve_recommend);
		
		confirmNotification();
		
		// 현재 시간을 가져 온다.
		currentDate = dayveCommon.getCurrentDate();
		
//		Intent intent = new Intent(android.content.Intent.ACTION_SEND);
//		intent.setType("plain/text");
//		intent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "" });
//		intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
//		intent.putExtra(android.content.Intent.EXTRA_TEXT, "");
//		startActivity(Intent.createChooser(intent, "이메일 보내기"));
		
//		progressBarRecommend = (ProgressBar)findViewById(R.id.progressBarRecommend);
//		txtViewRecommendNotification = (TextView)findViewById(R.id.txtViewRecommendNotification);
//		
//		edtTextRecommendFrom = (EditText)findViewById(R.id.edtTextRecommendFrom);
//		edtTextRecommendFrom.setText(DAYVE_EMAIL);
//		edtTextRecommendTo = (EditText)findViewById(R.id.edtTextRecommendTo);
//		edtTextRecommendSubject = (EditText)findViewById(R.id.edtTextRecommendSubject);
//		edtTextRecommendContent = (EditText)findViewById(R.id.edtTextRecommendContent);
//		
//		btnRecommendSendEmail = (Button)findViewById(R.id.btnRecommendSendEmail);
//		btnRecommendSendEmail.setOnClickListener(new View.OnClickListener() {
//
//			public void onClick(View v) {
//				// TODO Auto-generated method stub
//				if(("").equals(edtTextRecommendFrom.getText().toString().trim())) {
//					new AlertDialog.Builder(DayveRecommendView.this)
//					.setTitle("이메일 보내기")
//					.setMessage("보내는 이메일 주소를 입력하세요.")
//					.setPositiveButton("확인", 
//						new DialogInterface.OnClickListener() {
//							
////							@Override
//							public void onClick(DialogInterface dialog, int which) {
//								// TODO Auto-generated method stub
//							}
//						}).show();
//				} else if(!dayveCommon.checkInputEmail(edtTextRecommendFrom.getText().toString().trim())) {
//					new AlertDialog.Builder(DayveRecommendView.this)
//					.setTitle("이메일 보내기")
//					.setMessage("보내는 이메일 주소가 유효한 이메일 주소 형식이 아닙니다.")
//					.setPositiveButton("확인", 
//						new DialogInterface.OnClickListener() {
//							
////							@Override
//							public void onClick(DialogInterface dialog, int which) {
//								// TODO Auto-generated method stub
//							}
//						}).show();
//				} else if(("").equals(edtTextRecommendTo.getText().toString().trim())) {
//					new AlertDialog.Builder(DayveRecommendView.this)
//					.setTitle("이메일 보내기")
//					.setMessage("받는 이메일 주소를 입력하세요.")
//					.setPositiveButton("확인", 
//						new DialogInterface.OnClickListener() {
//							
////							@Override
//							public void onClick(DialogInterface dialog, int which) {
//								// TODO Auto-generated method stub
//							}
//						}).show();
//				} else if(!dayveCommon.checkInputEmail(edtTextRecommendTo.getText().toString().trim())) {
//					new AlertDialog.Builder(DayveRecommendView.this)
//					.setTitle("이메일 보내기")
//					.setMessage("받는 이메일 주소가 유효한 이메일 주소 형식이 아닙니다.")
//					.setPositiveButton("확인", 
//						new DialogInterface.OnClickListener() {
//							
////							@Override
//							public void onClick(DialogInterface dialog, int which) {
//								// TODO Auto-generated method stub
//							}
//						}).show();
//				} else if(("").equals(edtTextRecommendSubject.getText().toString().trim())) {
//					new AlertDialog.Builder(DayveRecommendView.this)
//					.setTitle("이메일 보내기")
//					.setMessage("제목을 입력하세요.")
//					.setPositiveButton("확인", 
//						new DialogInterface.OnClickListener() {
//							
////							@Override
//							public void onClick(DialogInterface dialog, int which) {
//								// TODO Auto-generated method stub
//							}
//						}).show();
//				} else if(("").equals(edtTextRecommendContent.getText().toString().trim())) {
//					new AlertDialog.Builder(DayveRecommendView.this)
//					.setTitle("이메일 보내기")
//					.setMessage("내용을 입력하세요.")
//					.setPositiveButton("확인", 
//						new DialogInterface.OnClickListener() {
//							
////							@Override
//							public void onClick(DialogInterface dialog, int which) {
//								// TODO Auto-generated method stub
//							}
//						}).show();
//				} else {
//					mHandler.sendMessage(mHandler.obtainMessage(THREAD_SEND_EMAIL));
//				}
//			}
//			
//		});
	}
	
	/**
	 * SharedPreferences 정보를 확인 한다.
	 */
	public void confirmNotification() {
		String myPf = "kr.pe.johnkim.dayve.activity_preferences";
		SharedPreferences mSharedPreferences = getSharedPreferences(myPf, Activity.MODE_PRIVATE);
		
		// id 를 가져 온다.
		DAYVE_ID = mSharedPreferences.getString("dayve_id", "");
		DAYVE_PASSWORD = mSharedPreferences.getString("dayve_password", "");
		DAYVE_EMAIL = mSharedPreferences.getString("dayve_email", "");

	}
	
	/**
	 * Handler 를 정의한다.
	 * 모든 Thread 를 등록해 놓고 필요할때 호출한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			case THREAD_PROGRESS_BAR_VISIBLE : 
				progressBarRecommend.setVisibility(View.VISIBLE);
				txtViewRecommendNotification.setVisibility(View.VISIBLE);
				break;
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				progressBarRecommend.setVisibility(View.INVISIBLE);
				txtViewRecommendNotification.setVisibility(View.INVISIBLE);
				break;
			case THREAD_SEND_EMAIL : 
				threadSendEmail();
				break;
			case THREAD_SEND_EMAIL_SUCCESS : 
				showSendEmailToast();
				break;
			case THREAD_SEND_EMAIL_FAIL : 
				showDialogSendEmailFail();
				break;
			}
		}
	};
	
	/* (non-Javadoc)
	 * @see android.app.Activity#onResume()
	 */
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();

		// main thread 에서 child thread 를 호출 한다.
		Thread thread = new Thread(null, doBackgroundThreadProcessing, "Background_insertLog");
		thread.start();
		
		Intent intent = new Intent(android.content.Intent.ACTION_SEND);
		intent.setType("plain/text");
		intent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "" });
		intent.putExtra(android.content.Intent.EXTRA_SUBJECT, R.string.recommend_mail_subject);
		intent.putExtra(android.content.Intent.EXTRA_TEXT, R.string.recommend_mail_text);
		startActivity(Intent.createChooser(intent, getResources().getString(R.string.recommend_mail_title)));
		
		finish();
	}
	/* (non-Javadoc)
	 * @see android.app.Activity#onStart()
	 */
	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
	}
	/* (non-Javadoc)
	 * @see android.app.Activity#onStop()
	 */
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		
		finish();
	}
	
	/* 최상위 프로세스가 아닐 경우 프로세스를 종료 한다.
	 * 
	 * => Home Key 를 눌렀을때 프로세스를 종료 한다.
	 * 
	 * @see android.app.Activity#onPause()
	 */
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		
		if(!isForegrdound()) {
			DayvePreferenceView.activity.finish();
			System.exit(0);
		}
	}
	
	/**
	 * 현재 프로세스가 최상위로 실행중인지 검사 한다.
	 * 
	 * true : 최상위
	 * 
	 * @return
	 */
	public boolean isForegrdound() {
	    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
	    List<RunningTaskInfo> list = am.getRunningTasks(1);
	    ComponentName cn = list.get(0).topActivity;
	    String name = cn.getPackageName();
	     
	    return name.indexOf(getPackageName()) > -1;
	}
	
	private void threadSendEmail() {
		Log.i(TAG, "threadUpdateEmail");
		
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				updateEmail();
			}
			
		});
		
		thread.start();
	}
	
	private void updateEmail() {
		Intent intent = new Intent(android.content.Intent.ACTION_SEND);
		intent.setType("plain/text");
		intent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { edtTextRecommendTo.getText().toString().trim() });
		intent.putExtra(android.content.Intent.EXTRA_SUBJECT, edtTextRecommendSubject.getText().toString().trim());
		intent.putExtra(android.content.Intent.EXTRA_TEXT, edtTextRecommendContent.getText().toString().trim());
		startActivity(Intent.createChooser(intent, "이메일 보내기"));
		
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
	}
	
	
	/**
	 * 이메일 보내기에 실패하면 dialog 창을 띄운다.
	 */
	private void showDialogSendEmailFail() {
		Log.e(TAG, "showDialogRegisterCategoryFail");
		
		new AlertDialog.Builder(DayveRecommendView.this)
		.setTitle("이메일 보내기")
		.setMessage("이메일 보내기에 실패 했습니다." + "\n" + "다시 시도해 주시기 바랍니다.")
		.setPositiveButton("확인", 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * 이메일 보내기에 성공하면 toast 를 띄운다.
	 */
	private void showSendEmailToast() {
		CharSequence text = "이메일 보내기 성공";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 * 로그를 저장 한다.
	 */
	private void insertLog() {
		Log.i(TAG, "insertLog");
		
		DayveLog dayveLog = new DayveLog();
		
		dayveLog.setId(DAYVE_ID);
		dayveLog.setViewName(TAG);
		dayveLog.setAccessDate(currentDate);
		
		try {
			dayveCommonRest.registerLog(dayveLog);
			Log.i(TAG, "Success to insert log.");
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		}
	}
	
	/**
	 * 로그 저장은 UI 와 관계 없기 때문에 background thread 로 구현 함 : child thread
	 */
	private Runnable doBackgroundThreadProcessing = new Runnable() {
		
		public void run() {
			// TODO Auto-generated method stub
			insertLog();
		}
	};
}
